home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
THINKC
/
4_0
/
ORBMECHD
/
HILL'S.C
< prev
next >
Wrap
Text File
|
1991-02-18
|
8KB
|
296 lines
/**********************************************************************
Karl Dishaw 18 Feb 91
Hill's Equations applied. This function applies the force-free
solution of Hill's Equations to give the ╞V cost of an intercept
and rendezvous maneuver in similar orbits.
Method from Kaplan, Modern Spacecraft Dynamics & Control, pp112-5
**********************************************************************/
#include "orbmech.h"
#include "SANE.h"
#include "math.h"
#define HILLSEQNREC_SIZE 110
extern DialogPtr LambertDia, HohmannDia, HillsDia, KeplerDia, whichDialog, gHelpDia;
extern EventRecord gEvent;
extern TEHandle TEH;
extern decform gdecform;
extern int dirty;
struct ParamRec
{
extended value;
Str255 name;
};
extern struct ParamRec gParameter;
struct HillsEqnRec
{
extended orbit_radius;
extended altitude_difference, init_x_vel;
extended init_y_vel, epoch_difference, flight_time;
extended delta_v_x_initial, delta_v_y_initial, delta_v_x_final;
extended delta_v_y_final, delta_v_total;
} ;
typedef struct HillsEqnRec *HillsEqnPtr;
/**************************************/
Hills()
{
Handle inputH, itemHandle;
Str255 orStr, adStr, ivxStr, ivyStr, edStr, ftStr;
Str255 dvixStr, dviyStr, dvfxStr, dvfyStr, dvtStr;
int itemType;
Rect itemRect;
Boolean dont_panic = 1, miFlag = 0, auFlag = 0;
decimal result;
ControlHandle kmSecBut, miHrBut, radBut;
struct HillsEqnRec *data;
Ptr temp;
Str255 q, w, e, r, t, y, u, i, o, p, j, k, l, m, n;
temp = NewPtr( HILLSEQNREC_SIZE );
data = ( HillsEqnPtr) temp;
pStrCopy("\p\rOrbital Rendezvous Costs", q);
pStrCopy("\p\r orbit radius: ", w);
pStrCopy("\p\r altitude difference: ", e);
pStrCopy("\p\r epoch difference: ", r);
pStrCopy("\p\r flight time: ", t);
pStrCopy("\p\r primary: ", y);
pStrCopy("\p\r initial x velocity: ", u);
pStrCopy("\p\r initial y velocity: ", i);
pStrCopy("\p\r\rDelta-V required", o);
pStrCopy("\p\r initial x: ", j);
pStrCopy("\p\r initial y: ", k);
pStrCopy("\p\r final x: ", l);
pStrCopy("\p\r final y: ", m);
pStrCopy("\p\r total: ", n);
pStrCopy("\p\r\r", p);
GetDItem( HillsDia, ORB_RAD, &itemType, &inputH, &itemRect);
GetIText( inputH, &orStr );
Pstr_to_extended( &orStr, &data->orbit_radius, &dont_panic );
GetDItem( HillsDia, EPOCH_DIFF, &itemType, &inputH, &itemRect);
GetIText( inputH, &edStr );
Pstr_to_extended( &edStr, &data->epoch_difference, &dont_panic );
GetDItem( HillsDia, ALT_DIFF, &itemType, &inputH, &itemRect);
GetIText( inputH, &adStr );
Pstr_to_extended( &adStr, &data->altitude_difference, &dont_panic );
GetDItem( HillsDia, VX, &itemType, &inputH, &itemRect);
GetIText( inputH, &ivxStr );
Pstr_to_extended( &ivxStr, &data->init_x_vel, &dont_panic );
GetDItem( HillsDia, VY, &itemType, &inputH, &itemRect);
GetIText( inputH, &ivyStr );
Pstr_to_extended( &ivyStr, &data->init_y_vel, &dont_panic );
GetDItem( HillsDia, FLIGHT_TIME, &itemType, &inputH, &itemRect);
GetIText( inputH, &ftStr );
Pstr_to_extended( &ftStr, &data->flight_time, &dont_panic );
GetDItem ( HillsDia, KM_SEC, &itemType, &kmSecBut, &itemRect);
GetDItem ( HillsDia, MI_HR, &itemType, &miHrBut, &itemRect);
GetDItem ( HillsDia, RADIANS, &itemType, &radBut, &itemRect);
if ( dont_panic )
{
if ( ! GetCtlValue ( kmSecBut ) )
if ( GetCtlValue ( miHrBut ) ) {
data->orbit_radius *= MI_CONV;
data->epoch_difference *= MI_CONV;
data->altitude_difference *= MI_CONV;
data->flight_time *= HR_CONV;
data->init_x_vel *= MI_CONV / HR_CONV;
data->init_y_vel *= MI_CONV / HR_CONV;
miFlag = 1;
}
else {
data->orbit_radius *= AU_CONV;
data->epoch_difference *= AU_CONV;
data->altitude_difference *= AU_CONV;
data->flight_time *= YR_CONV;
data->init_x_vel *= AU_CONV / YR_CONV;
data->init_y_vel *= AU_CONV / YR_CONV;
auFlag = 1;
}
TEInsert( q+1, *q, TEH );
TEInsert( w+1, *w, TEH );
TEInsert( orStr+1, *orStr, TEH );
TEInsert( e+1, *e, TEH );
TEInsert( adStr+1, *adStr, TEH );
TEInsert( r+1, *r, TEH );
TEInsert( edStr+1, *edStr, TEH );
TEInsert( t+1, *t, TEH );
TEInsert( ftStr+1, *ftStr, TEH );
TEInsert( y+1, *y, TEH );
TEInsert( gParameter.name+1, *gParameter.name, TEH );
TEInsert( u+1, *u, TEH );
TEInsert( ivxStr+1, *ivxStr, TEH );
TEInsert( i+1, *i, TEH );
TEInsert( ivyStr+1, *ivyStr, TEH );
rendezvous_calculations( data );
if ( miFlag ) {
data->delta_v_x_initial /= MI_CONV / HR_CONV;
data->delta_v_y_initial /= MI_CONV / HR_CONV;
data->delta_v_x_final /= MI_CONV / HR_CONV;
data->delta_v_y_final /= MI_CONV / HR_CONV;
data->delta_v_total /= MI_CONV / HR_CONV;
}
if ( auFlag ) {
data->delta_v_x_initial /= AU_CONV / YR_CONV;
data->delta_v_y_initial /= AU_CONV / YR_CONV;
data->delta_v_x_final /= AU_CONV / YR_CONV;
data->delta_v_y_final /= AU_CONV / YR_CONV;
data->delta_v_total /= AU_CONV / YR_CONV;
}
if ( data->delta_v_x_initial > 9999.0 || data->delta_v_x_initial < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, data->delta_v_x_initial, &result );
dec2str( &gdecform, &result, dvixStr );
if ( data->delta_v_y_initial > 9999.0 || data->delta_v_y_initial < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, data->delta_v_y_initial, &result );
dec2str( &gdecform, &result, dviyStr );
if ( data->delta_v_x_final > 9999.0 || data->delta_v_x_final < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, data->delta_v_x_final, &result );
dec2str( &gdecform, &result, dvfxStr );
if ( data->delta_v_y_final > 9999.0 || data->delta_v_y_final < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, data->delta_v_y_final, &result );
dec2str( &gdecform, &result, dvfyStr );
if ( data->delta_v_total > 9999.0 || data->delta_v_total < .000001 )
gdecform.style = FLOATDECIMAL;
else
gdecform.style = FIXEDDECIMAL;
num2dec( &gdecform, data->delta_v_total, &result );
dec2str( &gdecform, &result, dvtStr );
TEInsert( o+1, *o, TEH );
TEInsert( j+1, *j, TEH );
TEInsert( dvixStr+1, *dvixStr, TEH );
TEInsert( k+1, *k, TEH );
TEInsert( dviyStr+1, *dviyStr, TEH );
TEInsert( l+1, *l, TEH );
TEInsert( dvfxStr+1, *dvfxStr, TEH );
TEInsert( m+1, *m, TEH );
TEInsert( dvfyStr+1, *dvfyStr, TEH );
TEInsert( n+1, *n, TEH );
TEInsert( dvtStr+1, *dvtStr, TEH );
TEInsert( p+1, *p, TEH );
dirty = 1;
GetDItem( HillsDia, DVIX, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, dvixStr );
GetDItem( HillsDia, DVIY, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, dviyStr );
GetDItem( HillsDia, DVFX, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, dvfxStr );
GetDItem( HillsDia, DVFY, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, dvfyStr );
GetDItem( HillsDia, DVT, &itemType, &itemHandle, &itemRect);
SetIText( itemHandle, dvtStr );
ShowSelect();
}
}
/*********************************/
rendezvous_calculations( data )
struct HillsEqnRec *data;
{
extended mu, a, xo, yo, t, vyi, vxi;
extended n, nt, snt, cnt, aa, b, c, d, e, f;
extended vyo, vxo, dvyi, dvxi, vxf, vyf, dtot;
mu = gParameter.value;
a = data->orbit_radius;
xo = data->altitude_difference;
yo = data->epoch_difference;
t = data->flight_time;
vyi = data->init_y_vel;
vxi = data->init_x_vel;
n = sqrt( mu / ( a * a * a ) );
nt = n * t;
snt = sin( nt );
cnt = cos( nt );
aa = ( 6.0 * xo * ( nt - snt ) - yo ) * n * snt;
b = 2.0 * n * xo * ( 4.0 - 3.0 * cnt ) * ( 1.0 - cnt );
c = ( 4.0 * snt - 3.0 * nt ) * snt;
d = 4.0 * ( 1.0 - cnt) * ( 1.0 - cnt );
vyo = ( aa - b ) / ( c + d );
e = n * xo * ( 4.0 - 3.0 * cnt );
f = 2.0 * ( 1.0 - cnt ) * vyo;
vxo = - ( e + f ) / snt;
dvyi = vyo - vyi;
dvxi = vxo - vxi;
vxf = vxo * cnt + ( 2.0 * vyo + 3.0 * n * xo ) * snt;
vyf = - 2.0 * vxo * snt + ( 4.0 * vyo + 6.0 * n * xo ) * cnt
- ( 3.0 * vyo + 6.0 * n * xo );
dtot = sqrt( dvyi * dvyi + dvxi * dvxi) + sqrt( vxf * vxf + vyf * vyf);
data->delta_v_x_initial = dvxi;
data->delta_v_y_initial = dvyi;
data->delta_v_x_final = vxf;
data->delta_v_y_final = vyf;
data->delta_v_total = dtot;
}